2003年11月03日
川俣晶の縁側ソフトウェア技術雑記 total 9164 count

Visual Basic .NETで、予約語の名前を持つクラスや変数を宣言する方法

Written By: 川俣 晶連絡先

 仕様書というのは、読んでいるはずなのに見落としがあるものです。

 時として、書いた本人すら見落としているものがあったりするわけで、これは人間の集中力の限界と言えるような気がします。

 と言うわけで、今日気付いたうっかり見落とし。

 Visual Basic .NETは、@ITで延々と連載でVisual Basic 6.0との相違を説明したので、大抵の言語仕様は調査済みだと思っていましたが、ごく基本的なところで見落としがありました。

 Visual Basic .NETは、.NET Framework上で動作する関係上、他プログラム言語で記述されたコードを呼んだり呼ばれたりすることが容易に実現できます。それは予約語に絡んで1つの問題を引き起こします。予約語を名前としたクラスや変数を宣言することは、言語仕様的に禁止されているプログラム言語は珍しくありません。しかし、予約語はプログラム言語の種類が変われば違う名前群に変わってしまうものです。この状況で、複数プログラム言語を混在させると、問題が起きる危険があります。必要なキーワードを書けない、という事態が起こりえるのです。

 Visual Basic .NETでは、エスケープ識別子というものを導入して、これを解決しています。

 以下は、Visual Basic .NETの言語仕様「2.2 識別子」(MSDN Library DVD-ROM 2003 Oct)からの引用です。

Imports System

Class [class]

    Shared Sub [shared](ByVal [boolean] As Boolean)

        If [boolean] Then

            Console.WriteLine("true")

        Else

            Console.WriteLine("false")

        End If

    End Sub

End Class

Module [module]

    Sub Main()

        [class].[shared](True)

    End Sub

End Module

 これは、本来使えないはずのキーワードclass、shared、boolean、moduleを使用しています。たとえば、Visual Basic .NETは名前の大文字と小文字を区別しないので、classというキーワードはクラスを宣言する予約語Classと一致してしまいます。つまり、そのまま書くとコンパイルエラーになります。

 しかし、前後を[……]でくくって、エスケープ識別子というものにすると、コンパイル可能になります。

 こんなに面白い機能なのに話題に出てくることが少ないような気がします。もしや、Visual Basic 6.0からある機能かと思って試してみましたけど、通りません。

 ちなみに、googleで「エスケープ識別子」として検索すると4件しか出てきません。

余談 §

 上記仕様書の

通常の識別子はキーワードと一致しないこともありますが、エスケープ識別子では一致します。

 という日本語訳はちょっと変な感じですね。

 原文はこうなっています。

Regular identifiers may not match keywords, but escaped identifiers can.

 may notは辞書によると可能性の否定だそうなので、おそらく「通常の識別子はキーワードと一致する可能性はありませんが、エスケープ識別子では一致できます」みたいな意味ではないかと。